package com.zenithmind.task.utils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

/**
 * 任务工具类
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public class TaskUtils {

    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private static final Pattern EMAIL_PATTERN = Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$");

    /**
     * 获取任务状态文本
     * 
     * @param status 状态值
     * @return 状态文本
     */
    public static String getStatusText(Integer status) {
        if (status == null) {
            return "未知";
        }
        switch (status) {
            case 1: return "待办";
            case 2: return "进行中";
            case 3: return "已完成";
            case 4: return "已取消";
            case 5: return "已暂停";
            default: return "未知";
        }
    }

    /**
     * 获取优先级文本
     * 
     * @param priority 优先级值
     * @return 优先级文本
     */
    public static String getPriorityText(Integer priority) {
        if (priority == null) {
            return "未知";
        }
        switch (priority) {
            case 1: return "低";
            case 2: return "中";
            case 3: return "高";
            case 4: return "紧急";
            default: return "未知";
        }
    }

    /**
     * 获取优先级颜色
     * 
     * @param priority 优先级值
     * @return 颜色代码
     */
    public static String getPriorityColor(Integer priority) {
        if (priority == null) {
            return "#d9d9d9";
        }
        switch (priority) {
            case 1: return "#52c41a"; // 绿色
            case 2: return "#1890ff"; // 蓝色
            case 3: return "#fa8c16"; // 橙色
            case 4: return "#f5222d"; // 红色
            default: return "#d9d9d9"; // 灰色
        }
    }

    /**
     * 获取任务类型文本
     * 
     * @param taskType 任务类型值
     * @return 类型文本
     */
    public static String getTaskTypeText(Integer taskType) {
        if (taskType == null) {
            return "未知";
        }
        switch (taskType) {
            case 1: return "个人任务";
            case 2: return "团队任务";
            case 3: return "项目任务";
            default: return "未知";
        }
    }

    /**
     * 计算剩余天数
     * 
     * @param endTime 结束时间
     * @return 剩余天数
     */
    public static Integer calculateRemainingDays(LocalDateTime endTime) {
        if (endTime == null) {
            return null;
        }
        LocalDateTime now = LocalDateTime.now();
        if (endTime.isBefore(now)) {
            return 0;
        }
        return (int) ChronoUnit.DAYS.between(now, endTime);
    }

    /**
     * 计算逾期天数
     * 
     * @param endTime 结束时间
     * @return 逾期天数
     */
    public static Integer calculateOverdueDays(LocalDateTime endTime) {
        if (endTime == null) {
            return null;
        }
        LocalDateTime now = LocalDateTime.now();
        if (endTime.isAfter(now)) {
            return 0;
        }
        return (int) ChronoUnit.DAYS.between(endTime, now);
    }

    /**
     * 判断任务是否逾期
     * 
     * @param endTime 结束时间
     * @param status 任务状态
     * @return 是否逾期
     */
    public static Boolean isOverdue(LocalDateTime endTime, Integer status) {
        if (endTime == null || status == null) {
            return false;
        }
        // 已完成或已取消的任务不算逾期
        if (status == 3 || status == 4) {
            return false;
        }
        return endTime.isBefore(LocalDateTime.now());
    }

    /**
     * 格式化文件大小
     * 
     * @param size 文件大小（字节）
     * @return 格式化后的大小
     */
    public static String formatFileSize(Long size) {
        if (size == null || size <= 0) {
            return "0 B";
        }
        
        String[] units = {"B", "KB", "MB", "GB", "TB"};
        int unitIndex = 0;
        double fileSize = size.doubleValue();
        
        while (fileSize >= 1024 && unitIndex < units.length - 1) {
            fileSize /= 1024;
            unitIndex++;
        }
        
        return String.format("%.2f %s", fileSize, units[unitIndex]);
    }

    /**
     * 生成任务路径
     * 
     * @param parentPath 父路径
     * @param taskId 任务ID
     * @return 任务路径
     */
    public static String generateTaskPath(String parentPath, String taskId) {
        if (parentPath == null || parentPath.isEmpty()) {
            return "/" + taskId;
        }
        return parentPath + "/" + taskId;
    }

    /**
     * 解析标签字符串为列表
     * 
     * @param tags 标签字符串（逗号分隔）
     * @return 标签列表
     */
    public static List<String> parseTagsToList(String tags) {
        if (tags == null || tags.trim().isEmpty()) {
            return List.of();
        }
        return Arrays.asList(tags.split(","));
    }

    /**
     * 将标签列表转换为字符串
     * 
     * @param tagList 标签列表
     * @return 标签字符串
     */
    public static String parseTagsToString(List<String> tagList) {
        if (tagList == null || tagList.isEmpty()) {
            return null;
        }
        return String.join(",", tagList);
    }

    /**
     * 验证邮箱格式
     * 
     * @param email 邮箱地址
     * @return 是否有效
     */
    public static Boolean isValidEmail(String email) {
        if (email == null || email.trim().isEmpty()) {
            return false;
        }
        return EMAIL_PATTERN.matcher(email).matches();
    }

    /**
     * 生成时间显示文本
     * 
     * @param dateTime 时间
     * @return 显示文本
     */
    public static String generateTimeText(LocalDateTime dateTime) {
        if (dateTime == null) {
            return "";
        }
        
        LocalDateTime now = LocalDateTime.now();
        long minutes = ChronoUnit.MINUTES.between(dateTime, now);
        
        if (minutes < 1) {
            return "刚刚";
        } else if (minutes < 60) {
            return minutes + "分钟前";
        } else if (minutes < 1440) { // 24小时
            return (minutes / 60) + "小时前";
        } else if (minutes < 10080) { // 7天
            return (minutes / 1440) + "天前";
        } else {
            return dateTime.format(DATE_TIME_FORMATTER);
        }
    }

    /**
     * 计算完成率
     * 
     * @param completed 已完成数量
     * @param total 总数量
     * @return 完成率（百分比）
     */
    public static Double calculateCompletionRate(Long completed, Long total) {
        if (total == null || total == 0) {
            return 0.0;
        }
        if (completed == null) {
            completed = 0L;
        }
        return (completed.doubleValue() / total.doubleValue()) * 100;
    }

    /**
     * 验证任务标题
     * 
     * @param title 标题
     * @param maxLength 最大长度
     * @return 是否有效
     */
    public static Boolean isValidTitle(String title, Integer maxLength) {
        if (title == null || title.trim().isEmpty()) {
            return false;
        }
        return title.length() <= maxLength;
    }

    /**
     * 清理HTML标签
     * 
     * @param content 内容
     * @return 清理后的内容
     */
    public static String cleanHtmlTags(String content) {
        if (content == null) {
            return null;
        }
        return content.replaceAll("<[^>]+>", "");
    }

    /**
     * 截取文本
     * 
     * @param text 文本
     * @param maxLength 最大长度
     * @return 截取后的文本
     */
    public static String truncateText(String text, Integer maxLength) {
        if (text == null || maxLength == null || text.length() <= maxLength) {
            return text;
        }
        return text.substring(0, maxLength) + "...";
    }
}
